#include <sqlite3.h>
#include <stdio.h>

/*
	功能：我们连接到数据库，创建一个表，并在创建的表中插入8行。test.dbCars
	
	sqlite> .open test.db
	sqlite> .mode column  
	sqlite> .headers on
	我们使用该工具验证写入的数据。
	首先，我们修改数据在控制台中的显示方式。
	我们使用列模式并打开标题。sqlite3

	
	
*/
int main(void) {
    
    sqlite3 *db;

    //如果发生错误，此指针将指向创建的错误消息。
    char *err_msg = 0;

    //1.将创建与数据库的连接。test.db
    int rc = sqlite3_open("test.db", &db);
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }

    //2.这些 SQL 语句创建一个表并用数据填充它。这些语句必须用分号分隔。Cars
    char *sql = "DROP TABLE IF EXISTS Cars;" 
                "CREATE TABLE Cars(Id INT, Name TEXT, Price INT);" 
                "INSERT INTO Cars VALUES(1, 'Audi', 52642);" 
                "INSERT INTO Cars VALUES(2, 'Mercedes', 57127);" 
                "INSERT INTO Cars VALUES(3, 'Skoda', 9000);" 
                "INSERT INTO Cars VALUES(4, 'Volvo', 29000);" 
                "INSERT INTO Cars VALUES(5, 'Bentley', 350000);" 
                "INSERT INTO Cars VALUES(6, 'Citroen', 21000);" 
                "INSERT INTO Cars VALUES(7, 'Hummer', 41400);" 
                "INSERT INTO Cars VALUES(8, 'Volkswagen', 21600);";

	/*
		该函数是 围绕 的方便包装器，它允许应用程序运行多个 SQL 语句，
		而不必使用大量的 C 代码。
		sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

		sqlite3*            : open 打开的数据库
		const char* sql,    : 执行的sql功能语句
		*callback,          : sql语句对应的回调函数
		void* data,         : 传递给回调函数的 指针参数
		char **errmsq       : 错误信息

	*/
    rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    
    if (rc != SQLITE_OK ) {
        
        fprintf(stderr, "SQL error: %s\n", err_msg);

        //分配的消息字符串必须通过函数调用释放。sqlite3_free()
        sqlite3_free(err_msg);        
        sqlite3_close(db);
        
        return 1;
    } 
    
    sqlite3_close(db);
    
    return 0;
}


